در بخش اول اين مقاله به تشريح انواع Data Provider و در بخش دوم با نحوه ايجاد يک Connection آشنا شديم . در اين بخش به بررسی نحوه مديريت يک Connection خواهيم پرداخت . پس از تعريف خصلت ConnectionString مربوط به شی Connection ، می توان با استفاده از متدهای Close و Open ، مديريت وضعيت Connection جاری را انجام داد . در ادامه با نحوه استفاده از متدهای فوق و پاسخگوئی به رويدادهای Connection آشنا خواهيم شد. فعال نمودن و غير فعا ل نمودن يک Connection لازم است به اين نکته اشاره گردد که بستن ( غير فعال نمودن ) يک Connection امری لازم و ضروری است ، چراکه اکثر منابع داده صرفا" تعداد محدودی از ارتباطات فعال را حمايـت نموده و در ضمن ارتباطات فعال ، منابع با ارزش سيستم را اشغال و حجم عملياتی بر روی سيستم را افزايش خواهند داد . فعال نمودن و غير فعال نمودن صريح يک Connection پس از استفاده Connection ، لازم است که ارتباط ايجاد شده غير فعال گردد . بدين منظور، می توان از متدهای Close و يا Dispose مربوط به شی Connection استفاده نمود. متد Close ، تراکنش های بلاتکليف را تعيين تکليف نموده و در ادامه ارتباط را غير فعال می نمايد . در موارديکه Pooling فعال شده باشد ، متد فوق باعث آزادسازی ارتباط ايجاد شده از Connection pool می گردد . فراخوانی متد Close توسط يک برنامه می تواند چندين مرتبه صورت پذيرد. فعال نمودن و غير فعال نمودن تلويحی يک Connection مثال : در صورتيکه يک DataSet داده خود را از چندين جدول متفاوت که در بانک اطلاعاتی مشابه قرار دارند ، دريافت می نمايد ،صرفا" يک Connection وجود داشته و دارای چندين DataAdapters خواهيم بود (هر DataAdapters مرتبط با يک جدول ) . در صورتيکه Connection بصورت تلويحی ( عدم استفاده صريح از متدهای Open و Close ) فعال و يا غير فعال گردد ، در زمان پر نمودن اطلاعات در Dataset ، ارتباط با منبع داده چندين مرتبه فعال و يا غير فعال خواهد شد . در چنين مواردی مناسب است که در ابتدا Connection با صراحت فعال و پس از فراخوانی متدهای Filling مربوط به چندين DataAdapters ، ارتباط ايجاد شده با منبع داده را با بکارگيری متد Close و باصراحت غير فعال نمود . استفاده از متد Dispose مثال : استفاده از متد Dispose نحوه استفاده از متد Dispose تعريف و نمونه سازی يک شی جديد SqlConnection ' Dim cnNorthwind AS New System.Data.SqlClient.SqlConnection () مقدار دهی مناسب خصلت ConnectionString ' cnNorthwind.ConnectionString = "Data Source="(Local); " & _ "Initial Catalog = Northwind;" & _ "Integrated Security=SSPI;" فعال نمودن Connection ' cnNorthwind.open() انجام عمليات دلخواه و مرتبط با بانک اطلاعاتی ' cnNorthwind.Close() Dispose نمودن ارتباط که باعث حذف connection از connection pool بر روی ' سرويس دهنده می گردد ، ذخيره سازی منابع سرويس دهنده ' cnNortwind.Dispose() آزاد سازی حافظه اشغال شده توسط شی SqlConnection ' cnNorthwind = Nothing برخورد با رويدادهای Connection رويداد StateChange
بمنظور فعال نمودن و يا غير فعال نمودن يک Connection می توان بصورت تلويحی عمليات فوق را با فراخوانی متدهای يک شی که از Connection استفاده می نمايند انجام و يا با صراحت و بکمک متدهای Open و يا Close اقدام به فعال نمودن و يا غير فعال نمودن Connection نمود . متدهای Open و Close دو متد اوليه برای هر Connection می باشند .
استفاده صريح از متدهای Open و Close بمنظور فعال نمودن و يا غير فعال نمودن Connection توصيه و دارای مزايای زير است :
در صورت استفاده از DataAdapters ، ضرورتی به فعال نمودن و يا غير فعال نمودن يک Connection وجود نخواهد داشت . زمانيکه يکی از متدهای مربوط به اشياء فوق ، فراخوانده می گردد ( مثلا" متد Update و يا Fill مربوط به شی SqlDataAdapter ) ، متد مورد نظر بررسی لازم در خصوص فعال بودن ارتباط را انجام و در صورتيکه ارتباط فعال نشده باشد ، SqlDataAdapter ارتباط را فعال و پس از انجام عمليات مورد نظر ، ارتباط را غير فعال خواهد نمود .
زمانيکه يک Connection غيرفعال می گردد ، جريان اطلاعات به و يا از منبع داده غير فعال می گردد. در چنين حالتی ، منابع غيرمديريت يافته استفاده شده توسط شی Connection ، آزاد نخواهند گرديد.در صورتيکه Connection pooling فعال شده باشد ، عمليات آزاد سازی Connection از Pool نيز انجام خواهد شد. اشياء SqlConnection و OleDbConnection دارای يک متد Dispose بوده که از آن بمنظور آزادسازی منابع غيرمديريت يافته استفاده می گردد . با فراخوانی متد Dispose ، عمليات حذف Connection از Connection pool نيز انجام خواهد شد .
در مثال زير، يک شی SqlConnection ايجاد و در ادامه با استفاده از متد Open فعال و سپس بمنظور غيرفعال نمودن Connection و آزاد سازی منابع استفاده شده توسط Connection از متد Dispose استفاده و در نهايت شی مورد نظر به Nothing مقداردهی شده است .
بستن Connection که باعث آزاد سازی آن از Connection Pool '
بر روی سرويس دهنده می گردد .'
رويداد StateChange زمانی که وضعيت Connection تغيير نمايد ، محقق می گردد( وضعيت Connection از فعال به غير فعال و يا از غير فعال به فعال تبديل گردد) .بمنظور برخورد مناسب با هر يک از رويدادها ، از يک Event handler استفاده می گردد. هر رويداد دارای Event handler مختص خود می باشد. Event handler مربوط به رويداد StateChange ، متدی است که دارای آرگومانی از نوع StateChangeEventArgs می باشد . آرگومان فوق، شامل داده مرتبط با رويداد است .
نوع NET data provider . ، که از آن استفاده می گردد ، آرگومان های خاص مربوط به رويداد StateChange را مشخص می نمايد :
- رويداد SqlConnection.StateChange برای يک شی SqlConnection
- رويداد OleDbConnection.StateChange برای يک شی OleDbConnection
لازم است بدين نکته اشاره گردد که تمامی رويدادها در دات نت دارای دو پارامتر زير می باشند :
- ارسال کننده ( از نوع شی )
- e از نوع XxxEventArgs
برای رويداد StateChange ، پارامتر e از نوع StateChangeEventArgs می باشد.
event handler مربوط به دو رويداد فوق ، نوع مشابهی از آرگومان ها را دريافت می نمايد : StateChangeEventArgs که شامل داده مرتبط با اين رويداد است . جدول زير خصلت های مربوط به کلاس StateChangeEventArgs را نشان می دهد :
شرح |
خصلت |
خصلت فوق ، وضعيت جديد Connection را مشخص می نمايد. زمانيکه رويداد محقق گردد، شی Connection همواره در يک وضعيت جديد خواهد بود . |
CurrentSatate |
وضعيت اوليه Connection را برمی گرداند . |
OriginalSate |
نمونه ای از يک Event Handler مربوط به StateChange
مثال زير نحوه ايجاد StateChangeEventHandler را با VB.NET ، نشان می دهد :
نحوه استفاده ازيک Event Handler با استفاده از VB.NET |
Private Sub cnNorthwind_State ( ByVal Sender As Object , ByVal e As System.Data.StateChangeEventArgs) Handles cnNorthwind.StateChange نمايش وضعيت اوليه و جاری State در يک messagebox ' MessageBox.Show("CurrentState: "& e.Currentstate.ToString() & vbCrLF & _ "OriginalState : " & e.OriginalState.ToString() , _ |
در بخش چهارم اين مقاله به بررسی Connection Exceptions ، خواهيم پرداخت .
نظرات شما عزیزان: